package com.example.demo.lc;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

/**
 * 给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
 *
 * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
 *
 * 请注意，返回的 规范路径 必须遵循下述格式：
 *
 * 始终以斜杠 '/' 开头。
 * 两个目录名之间必须只有一个斜杠 '/' 。
 * 最后一个目录名（如果存在）不能 以 '/' 结尾。
 * 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
 * 返回简化后得到的 规范路径 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/simplify-path
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode71 {

    /**
     * https://leetcode-cn.com/problems/simplify-path/
     * @param args
     */
    public static void main(String[] args) {
        //egg1:String path = "/home/";
        //egg2:String path = "/../";
        //egg3:String path = "/home//foo/";
        String path = "/a/./b/../../c/";
        System.out.println(simplifyPathDeque(path));
    }

    /**
    * @author wzh
    * @date 2021/7/19 11:12 上午
    * @Description  stack
    */
    public static String simplifyPath(String path) {
        String[] split = path.split("/");
        if(split.length == 0){
            return "/";
        }
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < split.length; i++) {
            if(split[i].equals(".") || split[i].equals(""))continue;
            if(split[i].equals("..")){
                if(!stack.isEmpty()){
                    stack.pop();
                }
                continue;
            }
            stack.push(split[i]);
        }

        //输出路径
        StringBuilder str = new StringBuilder();
        if(stack.isEmpty()){
            str.insert(0,"/");
        }else{
            while (!stack.isEmpty()){
                str.insert(0,stack.pop());
                str.insert(0,"/");
            }
        }
        return str.toString();
    }

    /**
    * @author wzh
    * @date 2021/7/19 11:12 上午
    * @Description   deque
    */
    public static String simplifyPathDeque(String path) {
        String[] split = path.split("/");
        if(split.length == 0){
            return "/";
        }
        Deque<String> queue = new LinkedList<>();
        for (int i = 0; i < split.length; i++) {
            if(split[i].equals(".") || split[i].equals(""))continue;
            if(split[i].equals("..")){
                if(!queue.isEmpty()){
                    queue.pollLast();
                }
                continue;
            }
            queue.offer(split[i]);
        }
        //输出路径
        StringBuilder str = new StringBuilder("/");
        while (!queue.isEmpty()){
            str.append(queue.poll());
            if(!queue.isEmpty()){
                str.append("/");
            }
        }
        return str.toString();
    }
}
